home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 31
/
Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso
/
Aminet
/
dev
/
c
/
vbccsrc.lha
/
vbcc
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-03-07
|
21KB
|
572 lines
/* $VER: vbcc (main.c) V0.4 */
#include "vbc.h"
static char FILE_[]=__FILE__;
int endok=1;
int line,errors;
char *multname[]={"","s"};
void raus(void)
/* Beendet das Programm */
{
if(DEBUG) printf("raus()\n");
if(!endok) printf("unexpected end of file\n");
if(errors) printf("%d error%s found!\n",errors,multname[errors>1]);
while(nesting>=0) leave_block();
if(in[0]&&(c_flags[17]&USEDFLAG)) fclose(in[0]);
cleanup_cg(out);
if(ppout) fclose(ppout);
if(out) fclose(out);
if(ic1) fclose(ic1);
if(ic2) fclose(ic2);
if(!(c_flags[17]&USEDFLAG)) pp_free();
if(endok&&!errors) exit(EXIT_SUCCESS); else exit(EXIT_FAILURE);
}
int eof;
void translation_unit(void)
/* bearbeitet translation_unit */
/* hier z.Z. nur provisorisch */
{
while(1){
killsp();
if(c_flags[18]&USEDFLAG){
fputs(string,ppout);fputc('\n',ppout);
s=string;*s=0;
}else{
if(eof||(!isalpha((unsigned char)*s)&&*s!='_')){
if(!eof) error(0);
raus();
}
endok=0;
var_declaration();
endok=1;
}
}
}
void dontwarn(char *p)
/* schaltet flags fuer Meldung auf DONTWARN */
{
int i;
if(*p!='=') error(4,"-dontwarn");
i=atoi(p+1);
if(i>=err_num) error(159,i);
if(i<0){
for(i=0;i<err_num;i++)
if(!(err_out[i].flags&(ANSIV|FATAL)))
err_out[i].flags|=DONTWARN;
return;
}
if(err_out[i].flags&(ANSIV|FATAL)) error(160,i);
err_out[i].flags|=DONTWARN;
}
void warn(char *p)
/* schaltet Warnung fuer Meldung ein */
/* wenn Nummer<0 sind alle Warnungen ein */
{
int i;
if(*p!='=') error(4,"-warn");
i=atoi(p+1);
if(i>=err_num) error(159,i);
if(i<0){
for(i=0;i<err_num;i++) err_out[i].flags&=~DONTWARN;
return;
}else err_out[i].flags&=~DONTWARN;
}
extern char *copyright;
int main(int argc,char *argv[])
{
int i,j,fname=0;
c_flags_val[9].f=dontwarn;
c_flags_val[10].f=warn;
for(i=1;i<argc;i++){
if(*argv[i]!='-'){ /* kein Flag */
if(fname){
error(1);
}else fname=i;
}else{
int flag=0;
for(j=0;j<MAXCF&&flag==0;j++){
size_t l;
if(!c_flags_name[j]) continue;
l=strlen(c_flags_name[j]);
if(l>0&&!strncmp(argv[i]+1,c_flags_name[j],l)){
flag=1;
if((c_flags[j]&(USEDFLAG|FUNCFLAG))==USEDFLAG){error(2,argv[i]);break;}
c_flags[j]|=USEDFLAG;
if(c_flags[j]&STRINGFLAG){
if(argv[i][l+1]!='='){error(3,argv[i]);}
if(argv[i][l+2]||i>=argc-1)
c_flags_val[j].p=&argv[i][l+2];
else
c_flags_val[j].p=&argv[++i][0];
}
if(c_flags[j]&VALFLAG){
if(argv[i][l+1]!='='){error(4,argv[i]);}
if(argv[i][l+2]||i>=argc-1)
c_flags_val[j].l=atol(&argv[i][l+2]);
else
c_flags_val[j].l=atol(&argv[++i][0]);
}
if(c_flags[j]&FUNCFLAG) c_flags_val[j].f(&argv[i][l+1]);
}
}
for(j=0;j<MAXGF&&flag==0;j++){
size_t l;
if(!g_flags_name[j]) continue;
l=strlen(g_flags_name[j]);
if(l>0&&!strncmp(argv[i]+1,g_flags_name[j],l)){
flag=1;
if((g_flags[j]&(USEDFLAG|FUNCFLAG))==USEDFLAG){error(2,argv[i]);break;}
g_flags[j]|=USEDFLAG;
if(g_flags[j]&STRINGFLAG){
if(argv[i][l+1]!='='){error(3,argv[i]);}
if(argv[i][l+2]||i>=argc-1)
g_flags_val[j].p=&argv[i][l+2];
else
g_flags_val[j].p=&argv[++i][0];
}
if(g_flags[j]&VALFLAG){
if(argv[i][l+1]!='='){error(4,argv[i]);}
if(argv[i][l+2]||i>=argc-1)
g_flags_val[j].l=atol(&argv[i][l+2]);
else
g_flags_val[j].l=atol(&argv[++i][0]);
}
if(g_flags[j]&FUNCFLAG) g_flags_val[j].f(&argv[i][l+1]);
}
}
if(!flag){error(5,argv[i]);}
}
}
if(!(c_flags[6]&USEDFLAG)){
printf("%s\n",copyright);
printf("%s\n",cg_copyright);
}
if(!(c_flags[17]&USEDFLAG)) pp_init();
if(!(c_flags[8]&USEDFLAG)) c_flags_val[8].l=10; /* max. Fehlerzahl */
if(c_flags[22]&USEDFLAG) c_flags[7]|=USEDFLAG; /* iso=ansi */
if(c_flags[7]&USEDFLAG) error(209);
if(c_flags[0]&USEDFLAG) optflags=c_flags_val[0].l;
if(c_flags[11]&USEDFLAG) maxoptpasses=c_flags_val[11].l;
if(c_flags[12]&USEDFLAG) inline_size=c_flags_val[12].l;
if(c_flags[21]&USEDFLAG) fp_assoc=1;
if(c_flags[25]&USEDFLAG) unroll_size=c_flags_val[25].l;
if(c_flags[23]&USEDFLAG) noaliasopt=1;
if(!fname){error(6);}
inname=argv[fname];
strncpy(errfname,inname,FILENAME_MAX); /* das hier ist Muell - wird noch geaendert */
if(!init_cg()) exit(EXIT_FAILURE);
if(c_flags[24]&USEDFLAG) multiple_ccs=0;
if(c_flags[17]&USEDFLAG){
in[0]=fopen(inname,"r");
if(!in[0]) {error(7,inname);}
}else{
if(!pp_include(inname)) error(7,inname);
}
if(!(c_flags[18]&USEDFLAG)&&!(c_flags[5]&USEDFLAG)){
if(c_flags[1]&USEDFLAG){
out=open_out(c_flags_val[1].p,0);
}else{
out=open_out(inname,"asm");
}
if(!out){
if(c_flags[17]&USEDFLAG){
fclose(in[0]);
}else{
pp_free();
}
exit(EXIT_FAILURE);
}
}
if(c_flags[2]&USEDFLAG) ic1=open_out(inname,"ic1");
if(c_flags[3]&USEDFLAG) ic2=open_out(inname,"ic2");
if(c_flags[18]&USEDFLAG) ppout=open_out(inname,"i");
if(c_flags[4]&USEDFLAG) DEBUG=c_flags_val[4].l; else DEBUG=0;
switch_count=0;break_label=0;
*string=0;s=string;line=0;
killsp();
nesting=-1;enter_block();
translation_unit();
}
int mcmp(const char *s1,const char *s2)
/* Einfachere strcmp-Variante. */
{
char c;
do{
c=*s1++;
if(c!=*s2++) return(1);
}while(c);
return(0);
}
void cpbez(char *m,int check_keyword)
/* Kopiert den naechsten Bezeichner von s nach m. Wenn check_keyord!=0 */
/* wird eine Fehlermeldung ausgegeben, falls das Ergebnis ein */
/* reserviertes Keyword von C ist. */
{
char *p=m,*last=m+MAXI-1;int warned=0;
if(DEBUG&128) printf("Before cpbez:%s\n",s);
while(isalpha((unsigned char)*s)||isdigit((unsigned char)*s)||*s=='_'){
if(m<last){
*m++=*s++;
}else{
s++;
if(!warned){
error(206,MAXI-1);
warned=1;
}
}
}
*m=0;
if(DEBUG&128) printf("After cpbez:%s\n",s);
if(check_keyword){
char *n=p+1;
switch(*p){
case 'a': if(!mcmp(n,"uto")) error(216,p);
return;
case 'b': if(!mcmp(n,"reak")) error(216,p);
return;
case 'c': if(!mcmp(n,"ase")) error(216,p);
if(!mcmp(n,"har")) error(216,p);
if(!mcmp(n,"onst")) error(216,p);
if(!mcmp(n,"ontinue")) error(216,p);
return;
case 'd': if(!mcmp(n,"efault")) error(216,p);
if(!mcmp(n,"o")) error(216,m);
if(!mcmp(n,"ouble")) error(216,p);
return;
case 'e': if(!mcmp(n,"lse")) error(216,p);
if(!mcmp(n,"num")) erro